今天我用GAS和試算表製作多國語言翻譯機:
程式碼如下:
function myFunction(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// 如果 e 是 undefined(直接在編輯器執行),就用 A2 作為測試
if (!e) {
var testCell = sheet.getRange("A2");
e = {
range: testCell,
value: testCell.getValue()
};
}
這是一個 觸發器事件函數(通常用於 onEdit)
參數 e 代表 事件物件 (event object),包含被編輯的儲存格資訊(例如 range、value),可是如果直接在編輯器按「執行」,e 會是 undefined
但如果 e 是 undefined,就預設取 A2 儲存格作為測試,建立一個模擬事件物件 { range: ..., value: ... },讓下面程式可以正常運行。
var col = e.range.getColumn();
var row = e.range.getRow();
// 只處理第一欄、從第2列開始的儲存格
if (col === 1 && row >= 2 && e.value) {
// 中文簡體
var cn = LanguageApp.translate(e.value, 'zh-TW', 'zh-CN');
var cnURL = '=HYPERLINK("http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q='
+ encodeURIComponent(cn) + '&tl=zh-CN","' + cn + '")';
sheet.getRange(row, col + 1).setFormula(cnURL);
// 英文
var en = LanguageApp.translate(e.value, 'zh-TW', 'en');
var enURL = '=HYPERLINK("http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q='
+ encodeURIComponent(en) + '&tl=en","' + en + '")';
sheet.getRange(row, col + 2).setFormula(enURL);
// 日文
var ja = LanguageApp.translate(e.value, 'zh-TW', 'ja');
var jaURL = '=HYPERLINK("http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q='
+ encodeURIComponent(ja) + '&tl=ja","' + ja + '")';
sheet.getRange(row, col + 3).setFormula(jaURL);
}
}
// 測試函數:直接在編輯器執行即可測試
function testMyFunction() {
myFunction();
}
LanguageApp.translate(e.value, 'zh-TW', 'zh-CN') → 將繁體中文翻成簡體中文
encodeURIComponent(cn) → 將文字轉成 URL 編碼,避免空格或符號造成 TTS URL 失敗
=HYPERLINK("…","cn") → 在 B 欄生成一個超連結,點擊就會播中文簡體語音
col + 1 → B 欄,其他翻譯也是。
完成這個程式後,我覺得自己對 Google Apps Script 的理解更深入了。以前我只是知道可以操作試算表,現在才真正理解 getRange()、setFormula()、以及 LanguageApp.translate() 的運作方式,也明白了事件物件 e 在 onEdit 觸發器中的角色。寫程式的過程讓我學到,雖然語法看起來簡單,但實際應用中有很多細節需要注意,例如要避免覆蓋公式、要處理空值,以及 URL 中特殊字元要用 encodeURIComponent。